package com.lianxueda.drawing.common;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

/**
 * 封装统一格式的数据返回结构
 * 由于封装的 JSON 数据的类型不确定，所以在定义统一的 JSON 结构时，
 * 我们需要用到泛型。统一的 JSON 结构中属性包括数据、状态码、提示信息即可，
 * 构造方法可以根据实际业务需求做相应的添加即可，
 * 一般来说，应该有默认的返回结构，也应该有用户指定的返回结构。
 * @param <T>
 */
@Getter
@Setter
public class R<T> {

    private T data;
    private int code;
    private String msg;

    /**
     * 若没有数据返回，可以人为指定状态码和提示信息
     * @param code
     * @param msg
     */
    public R(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    /**
     * 有数据返回时，状态码为0，默认提示信息为：操作成功！
     * @param data
     */
    public R(T data) {
        this.data = data;
        this.code = 200;
        this.msg = "操作成功！";
    }

    /**
     * 有数据返回时，状态码为0，默认提示信息为：操作成功！
     * @param data
     * @return
     * @param <T>
     */
    public static <T> R<T> suc(T data) {
        return new R<T>(data);
    }


    public static <T> R<T> suc(String msg) {
        return new R<T>(200,msg);
    }

    /**
     * 没有数据返回时，状态码为1表示操作失败
     * @param msg 操作失败提示信息
     * @return
     * @param <T>
     */
    public static <T> R<T> fail(String msg) {
        return new R<>(1,msg);
    }

    /**
     * 没有数据返回时，状态码为500表示系统异常
     * @param msg 系统异常提示信息
     * @return
     * @param <T>
     */
    public static <T> R<T> err(String msg) {
        return new R<>(500,msg);
    }


}
